import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
 
 
class QPushButtonDemo(QDialog):
    def __init__(self):
        super(QPushButtonDemo, self).__init__()
        self.initUI()
 
    def initUI(self):
        self.setWindowTitle('QPushButton Demo')
        self.resize(350,200)
 
        layout=QVBoxLayout() #垂直布局
 
        self.btn1=QPushButton('第一个按钮')
        self.btn1.setText('First Button1')
        #下面两句配合使用，功能类似于单选框按钮QCheckBox
        self.btn1.setCheckable(True)
        self.btn1.toggle() #按一下就按下去了，再按一下才能抬起
        #btn1一个信号对应两个槽函数
        self.btn1.clicked.connect(self.buttonState) #先绑定谁系统就先调用谁
        self.btn1.clicked.connect(lambda :self.whichButton(self.btn1))
 
 
        layout.addWidget(self.btn1)
        #在文本前面显示图像
        self.btn2=QPushButton('图像按钮')
        self.btn2.setIcon(QIcon(QPixmap('casually input')))
        self.btn2.clicked.connect(lambda :self.whichButton(self.btn2))
        layout.addWidget(self.btn2)
 
        self.btn3=QPushButton('不可用的按钮')
        self.btn3.setEnabled(False)
        layout.addWidget(self.btn3)
 
        self.btn4=QPushButton('&MyButton') #设置了热键M/m
        self.btn4.setDefault(True) #如果没有任何按钮被选中，那么按回车就是按了这个按钮
        self.btn4.clicked.connect(lambda :self.whichButton(self.btn4))
        layout.addWidget(self.btn4)
 
        self.setLayout(layout)
    '''
    注意下面的方法是两个参数，如果用传统的信号与槽连接方式的话，只会将按钮对象本身传入，那样的话第二个参数就没有传入值了
    所以要用lambda表达式，当前对象直接调用这个函数，传入的值就对应第二个参数了
    '''
    def whichButton(self,btn):
        #self.sender() #通过此方法可得到是哪个按钮被按下,或者可用此方法中的传参方法
        print('被单击的按钮是<'+btn.text()+'>')
    def buttonState(self):
        if self.btn1.isChecked():
            print('按钮1已经被选中')
        else:
            print('按钮1未被选中')
 
 
if __name__=='__main__':
    app=QApplication(sys.argv)
    main=QPushButtonDemo()
    main.show()
    sys.exit(app.exec_())
